Alien Codex
1. 题目要求
1.1 你打开了一个 Alien 合约. 申明所有权来完成这一关.
这可能有帮助
- 理解Array Storage是怎么回事
- 理解 ABI specifications
- 使用一个非常
狗
方法
1.2 题目代码:
1 | // SPDX-License-Identifier: MIT |
2. 分析
tips: 参考博客
2.1 在 AlienCodex 合约中,我们可以利用该
retract()
函数导致数组长度出现整数下溢codex
。这个下溢允许我们通过函数修改合约中的任何状态变量revise()
。该漏洞可以按如下方式执行:- 调用
make_contact()
函数通过contacted()
修饰符检查,要求contact
为真。 - 调用
retract()
函数导致数组codex
长度整数溢出 - 通过以下方式找到状态变量的散列,
owner
就好像它是codex
数组的一部分一样:
- 获取数组中第一项的哈希值
codex
(因为它在合约存储中被索引),对应于它在合约存储中的槽位。这可以通过计算第一个位置的 Keccak256 哈希值来获得,因此:keccak256(0x0000000000000000000000000000000000000000000000000000000000000001)
。 - 取由此 (
0xb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6
) 产生的哈希值,并从合约中的最大插槽数量中减去其整数值加一 (2个256−1个), 大概是这样的: d.使用这个结果值作为
revise()
要修改的i
数组的(索引)和我们的地址。codex``_content
- 调用
2.2 参考视频 写的攻击合约
1 | interface IAlienCodex { |
3. 解题
- 3.1 获取关卡实例地址:0x175A96bA1755F20E85ff80089ec9000dD0df463e
- 3.2 将实例地址作为参数进行对攻击合约的部署
- 3.3 提交案例
- 3.4 成功!!!!